package cn.csc.module.member.service.user;

import cn.csc.framework.common.enums.TerminalEnum;
import cn.csc.framework.common.pojo.PageResult;
import cn.csc.framework.common.validation.Mobile;
import cn.csc.module.member.controller.admin.user.vo.MemberUserExportReqVO;
import cn.csc.module.member.controller.admin.user.vo.MemberUserInfoRespVO;
import cn.csc.module.member.controller.admin.user.vo.MemberUserPageReqVO;
import cn.csc.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
import cn.csc.module.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO;
import cn.csc.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO;
import cn.csc.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO;
import cn.csc.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO;
import cn.csc.module.member.dal.dataobject.user.MemberUserDO;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 会员用户 Service 接口
 *
 * @author
 */
public interface MemberUserService extends IService<MemberUserDO> {

    /**
     * 通过手机查询用户
     *
     * @param mobile 手机
     * @return 用户对象
     */
    MemberUserDO getUserByMobile(String mobile);

    /**
     * 通过手机查询用户,返回包括用户的角色列表
     *
     * @param mobile 手机
     * @return 用户对象
     */
    MemberUserInfoRespVO getByMobileWithRoles(String mobile);

    /**
     * 基于用户昵称，模糊匹配用户列表
     *
     * @param nickname 用户昵称，模糊匹配
     * @return 用户信息的列表
     */
    List<MemberUserDO> getUserListByNickname(String nickname);

    /**
     * 获得会员分页
     *
     * @param pageReqVO 分页查询
     * @return 会员分页
     */
    PageResult<MemberUserDO> getUserPage(MemberUserPageReqVO pageReqVO);

    /**
     * 导出数据
     *
     * @param exportReqVO 查询参数
     * @return 会员分页
     */
    List<MemberUserDO> getDetailList(MemberUserExportReqVO exportReqVO);

    /**
     * 基于手机号创建用户。
     * 如果用户已经存在，则直接进行返回
     *
     * @param userId     华智慧用户ID
     * @param mobile     手机号
     * @param registerIp 注册 IP
     * @param terminal   终端 {@link TerminalEnum}
     * @return 用户对象
     */
    MemberUserDO createUserIfAbsent(Long userId, @Mobile String mobile, String registerIp, Integer terminal);

    /**
     * 更新用户的最后登陆信息
     *
     * @param id      用户编号
     * @param loginIp 登陆 IP
     */
    void updateUserLogin(Long id, String loginIp);

    /**
     * 通过用户 ID 查询用户
     *
     * @param id 用户ID
     * @return 用户对象信息
     */
    MemberUserDO getUser(Long id);

    /**
     * 通过用户 ID 查询用户们
     *
     * @param ids 用户 ID
     * @return 用户对象信息数组
     */
    List<MemberUserDO> getUserList(Collection<Long> ids);

    /**
     * 【会员】修改基本信息
     *
     * @param userId 用户编号
     * @param reqVO  基本信息
     */
    void updateUser(Long userId, AppMemberUserUpdateReqVO reqVO);

    /**
     * 更新用户类型
     * @param type 用户类型
     * @param userId 用户编号
     * @return
     */
    Integer updateType(Integer type, Long userId);

    /**
     * 【会员】修改手机
     *
     * @param userId 用户编号
     * @param reqVO  请求信息
     */
    void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO);

    /**
     * 【会员】修改密码
     *
     * @param userId 用户编号
     * @param reqVO  请求信息
     */
    void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO);

    /**
     * 【会员】忘记密码
     *
     * @param reqVO 请求信息
     */
    void resetUserPassword(AppMemberUserResetPasswordReqVO reqVO);


    void resetUserPasswordWithoutSmsCode(AppMemberUserResetPasswordReqVO reqVO);

    /**
     * 判断密码是否匹配
     *
     * @param rawPassword     未加密的密码
     * @param encodedPassword 加密后的密码
     * @return 是否匹配
     */
    boolean isPasswordMatch(String rawPassword, String encodedPassword);

    /**
     * 【管理员】更新会员用户
     *
     * @param updateReqVO 更新信息
     */
    void updateUser(@Valid MemberUserUpdateReqVO updateReqVO);


}
